package com.example.ee_demo.controller;

import com.example.ee_demo.model.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * @className: HelloController
 * @author: 芃
 * @description: MVC学习
 * @date: 2024/12/6 17:41
 */
/**
 * MVC -> Model-View-Controller
 * Model:模型，数据模型，包含数据和业务逻辑
 * View:视图，展现层，负责呈现数据给用户
 * Controller:控制器，业务逻辑层，处理用户请求，并调用模型层和视图层进行数据交互
 *
 * @RestController注解是@Controller和@ResponseBody的组合注解，
 * 它将控制器的返回值直接写入HTTP响应的body中，
 * 并使用JSON或XML序列化器将对象转换为JSON或XML格式。
 *
 * @RequestMapping 注解用于客户端和服务器之间建立链接
 * 可作用于类，也可以作用于方法上  -》开发时，企业默认规则：路径前加上/ 、 类路径和方法路径一起使用（默认类路径可有可无）、类路径命名默认为Controller的前置命名
 * 修饰类时：访问路径是 类路径+方法路径
 * 修饰方法时：方法路径不可重复
 *
 */
@RestController
@RequestMapping("/request")
public class RequestController {

    @RequestMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }


    /**
     * @param name:
     * @param age:
     * @return String
     * @author: zyp19
     * @description: 传参时前端需要和后端接口参数名一致，否则无法获取到参数值
     * @date: 2024/12/19 17:50
     */
    @RequestMapping("/getInfo")
    public String getInfo(String name,Integer age) {
        return "姓名："+name+"，年龄："+age;
    }

    @RequestMapping("/getInfo2")
    public String getInfo2(Person person){
        return person.toString();
    }

    //@RequestParam注解用于参数重命名，后端和前端参数名不一致时使用，注解内为前端参数名
    // 加上这个注解后，这个前端参数为必传参数
    @RequestMapping("/getName")
    public String getName(@RequestParam("userName") String name) {
        return "姓名：" + name;
    }

    //RequestParam注解达到非必传的效果，加上required = false，表示age参数可不传
    @RequestMapping("/getAge")
    public String getAge(@RequestParam(value = "userAge",required = false) Integer age) {
        return "年龄：" + age;
    }


    // 数组传参
    @RequestMapping("getArray")
    public String getArray(String[] array){
        return "数组：" + Arrays.toString(array);
    }

    // 集合传参
    @RequestMapping("getList")
    public String getList(@RequestParam("list") List<String> list) {
        return "集合：" + list.toString();
    }


    //前端传递Json格式数据时，后端参数部分采用@RequestBody 修饰
    // Json的本质是一个字符串，这个字符串表示的是一个对象（具体什么对象，看情况而定）
    @RequestMapping("getJson")
    public String getJson(@RequestBody Person person) {
        return person.toString();
    }


    //从路径URL中获取参数
    @RequestMapping("/getValueByURL/{value}")
    public String getValueByURL(@PathVariable("value") Integer articleId){
        return "articleId = " + articleId;
    }


    //从路径URL中获取参数
    @RequestMapping("/getValueByURL2/{value}/{value2}")
    public String getValueByURL2(@PathVariable("value") Integer articleId, @PathVariable("value2") String name){
        return "articleId = " + articleId + ", name = " + name;
    }

    //上传文件
    @RequestMapping("/uploadFile")
    public String uploadFile(MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        file.transferTo(new File("D:\\My_Code\\Java_Code\\EE_And_System_New\\EE_Demo\\src\\main\\resources\\static\\images\\"+fileName));
        return "上传成功,文件名为："+fileName;
    }
}
